/**
 * 二次封装 axios 发起网络请求
 *
 * 实例、请求拦截器、响应拦截器
 */
import axios from 'axios'

// 导入进度条插件
import Nprogress from 'nprogress'
import 'nprogress/nprogress.css'

// axios 实例
const mockInstance = axios.create({
  baseURL: 'https://www.test.com', // 接口基准地址
  timeout: 5000 // 超时时长
})

// 添加请求拦截器
mockInstance.interceptors.request.use(
  (config) => {
    // 开启进度条
    Nprogress.start()

    // 在发送请求之前做些什么
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
mockInstance.interceptors.response.use(
  (response) => {
    // 隐藏进度条
    Nprogress.done()

    // 对返回的数据进行简化操作
    return response.data
  },
  (error) => {
    // 什么时候走 error 回调
    // 1. 网络超时
    // 2. http 状态码不以 2 开头
    // console.log(error)
    // 对响应错误做点什么

    // 第一种处理异常的方式，如果是 Promise.reject 将异常捕获到，继续往下传递
    // 交给接口调用者来自己手动进行设置
    // 如果以后需要手动处理，就使用这种方式
    // return Promise.reject(error)

    // 第二种方式：直接将错误结果 return 字符串
    // 成功的 Promise
    // 失败的 promise
    // 如果直接返回的是一个字串符或者对象，不是 promise，需要使用 .then 来接收对应结果
    // return error

    // 第三种方式：不将错误往下传递，promise 一直存在等待中，调用接口的时候，接收不到返回值
    alert(error.message)
    return new Promise(() => {})
  }
)

export default mockInstance
